iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Modern Web

.NET教我做人系列 第 6

Day 6 用LINE不如用LINQ

  • 分享至 

  • xImage
  •  

不知不覺已經到了第六天,時間怎麼過的那麼慢,我還以為今天都最後一天。算了,我還是得面對現實,今天的話想要來說說一個很特別的東西LINQ(Language Intergrated Query),我剛聽到這東西時還不知道是甚麼,還以為跟line會有關西,但實際上可差多了

甚麼是LINQ呢?

在很早期的時候,我們要對資料庫做處理時都是要運用到ADO.NET來進行資料的CRUD,而它也是在 Web Form 時期造成台灣的專案公司頗為熱宗使用的開發方式,但是 ADO.NETWeb From 的應用上不可能完全無缺點,所以這時LINQ的出現解決控制項效能和PostBack問題,但是相對門檻也提高了不少

說了那麼多最主要說的是,LINQ的出現提升了我們在資料查訓上的處理方式,在LINQ還沒出現之前我們還得要特別學另一種語言才能達到我們查詢的需求,例如SQL、XML...,當時寫出來的程式沒有統一的標準,也對工程師來說非常頭痛。透過 LINQ,查詢會是第一級語言建構,和類別、方法及事件相同

目前LINQ所可運用的地方如下圖,最常見的應該是SQL、XML、Object,下面的部分我也會針對其中一個做個練習。
https://ithelp.ithome.com.tw/upload/images/20220913/20139256nIrcMnZHDj.jpg

如何使用LINQ?

LINQ的是用非常簡單,他共有兩種方式查詢運算式(Query Expression Syntax)及標準查詢運算子(Standard Query Operators)兩種方式的寫法不太一樣,但是功能上是一樣的,更進階的用法還可以把兩種何在一起使用。

查詢運算式

查詢運算式的寫法跟SQL很類似,如果是對SQL很熟悉的人可以考慮用這寫法

string[] list = {"小黃", "小明", "小綠", "小王八", "小豬"};
var query = from item in list
            where item != "小豬"
            select item;
foreach(var item in list)
{
    Console.WriteLine(item);
}

最後出來的結果應該不會有小豬才對,那我們就練習了查詢運算式的方法了。

標準查詢運算子

標準查詢運算子的寫法是應用於集合類型的運算子,提供了包括篩選、彙總、排序...等查詢功能,像是Select、Where、First...,而這些方法就是運作於IEnumerable<T>IQueryable<T>之上。

int[] nums = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var query = nums.Where(u => u > 5)
                .Select(u => u);
foreach(var i in query)
{
    Console.WriteLine(i);
}

最後出來的結果應該只會印出大於5的數字,從這兩種寫法就可以知道兩種寫法可不太一樣,所以沒辦法說哪一種方法比較好,只能依自己當下的要求做選擇,而如果是我的話我會比較選擇標準查詢運算子的方法來做查詢

由於前面都是簡單利用list來做簡單的LINQ的查詢,最後的話再來做個比較實際會用到的例子,這裡我事先訂好學生應該會有的條件,後面我們在對我們的資料做個查詢

public class Student
{
    public string name;
    public string class_name;
    public int id;
    public bool sex;
    public float height;
    public float weight;
}
public class Score
{
    public string class_name;
    public int id;
    public int chinese_score;
    public int math_score;
    public int english_socre;
}
static void Main(string[] args)
{
    List<Student> students = new List<Student>(){
        new Student(){
            name = "小新",
            class_name = "向日葵班",
            id = 1,
            sex = true,
            height = 60,
            weight = 30
        },
        new Student(){
            name = "風間",
            class_name = "向日葵班",
            id = 2,
            sex = true,
            height = 56,
            weight = 36
        },
        new Student(){
            name = "正男",
            class_name = "向日葵班",
            id = 3,
            sex = true,
            height = 62,
            weight = 40
        },
        new Student(){
            name = "河村獵豹",
            class_name = "玫瑰班",
            id = 1,
            sex = true,
            height = 64,
            weight = 30
        },
        new Student(){
            name = "巢久井金太",
            class_name = "玫瑰班",
            id = 2,
            sex = true,
            height = 55,
            weight = 34
        }
    };
    List<Score> scores = new List<Score>(){
        new Score(){
            class_name = "向日葵班",
            id = 1,
            math_score = 100,
            chinese_score = 89,
            english_socre = 64
        },
        new Score(){
            class_name = "向日葵班",
            id = 2,
            math_score = 90,
            chinese_score = 79,
            english_socre = 100
        },
        new Score(){
            class_name = "玫瑰班",
            id = 1,
            math_score = 100,
            chinese_score = 98,
            english_socre = 45
        },
        new Score(){
            class_name = "玫瑰班",
            id = 2,
            math_score = 60,
            chinese_score = 60,
            english_socre = 61
        }
    };
    var query = students.Join(scores,
                              x => (x.class_name,x.id),
                              y => (y.class_name, y.id), 
                              (x, y)=> new {x.class_name , x.name, x.sex, y.chinese_score, y.math_score, y.english_socre})
                        .Where(u => u.english_socre >= 60 && u.class_name == "向日葵班")
                        .OrderByDescending(u => u.chinese_score);
    foreach(var i in query)
    {
        Console.WriteLine(i);
    }
}

這裡的話大家可以自己動手做看看,最後的結果如下

{ class_name = 向日葵班, name = 小新, sex = True, chinese_score = 89, math_score = 100, english_socre = 64 }
{ class_name = 向日葵班, name = 風間, sex = True, chinese_score = 79, math_score = 90, english_socre = 100 }

話說,這裡的話我們幾乎只有對 Object的資料作查詢,如果後面有接觸到SQL或XML的資料再來介紹給大家,所以在這裡就不多作介紹,希望今天的鐵人賽可以讓你對LINQ有更多的了解。最後感謝大家今天的聆聽,那大家我們就明天見囉!!!

參考資料:
http://www.crazyteam.es/wp-content/uploads/2008/11/linq_arquitecture.gif


上一篇
Day 5 <泛型>到底是甚麼鬼?
下一篇
Day 7 今天不lambda甚麼時候浪!
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言